package net.sf.odinms.client;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import net.sf.odinms.client.skills.*;

import net.sf.odinms.provider.MapleData;
import net.sf.odinms.provider.MapleDataProvider;
import net.sf.odinms.provider.MapleDataProviderFactory;
import net.sf.odinms.provider.MapleDataTool;
import net.sf.odinms.server.MapleStatEffect;
import net.sf.odinms.tools.StringUtil;
import net.sf.odinms.server.life.Element;

public class SkillFactory {

    private static Map<Integer, ISkill> skills = new HashMap<Integer, ISkill>();
    private static MapleDataProvider datasource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/Skill.wz"));
    private static MapleData stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/String.wz")).getData("Skill.img");

   public static ISkill getSkill(int id) {
     ISkill ret = (ISkill)skills.get(Integer.valueOf(id));
     int jobid = id / 10000;
     MapleData skillData = null;
     if (ret == null) {
         
         if (jobid >= 1000 && jobid <= 2218)
             skillData = datasource.getData(getLeftPaddedStr(String.valueOf(id / 10000), '0', 4) + ".img").getChildByPath("skill/" + getLeftPaddedStr(String.valueOf(id), '0', 8));
         else
             skillData = datasource.getData(getLeftPaddedStr(String.valueOf(id / 10000), '0', 3) + ".img").getChildByPath("skill/" + getLeftPaddedStr(String.valueOf(id), '0', 7));
         
         if (skillData != null) {
             ret = loadFromData(id, skillData);
             skills.put(Integer.valueOf(id), ret);
         } else
             return null;
     }
     return ret;
   }
   
    public static int getSkillMasterLevel(int id) {
     int jobid = id / 10000;
     MapleData skillData = null;
     if (jobid >= 1000 && jobid <= 2218)
         skillData = datasource.getData(getLeftPaddedStr(String.valueOf(id / 10000), '0', 4) + ".img").getChildByPath("skill/" + getLeftPaddedStr(String.valueOf(id), '0', 8));
     else
         skillData = datasource.getData(getLeftPaddedStr(String.valueOf(id / 10000), '0', 3) + ".img").getChildByPath("skill/" + getLeftPaddedStr(String.valueOf(id), '0', 7));    
     if(skillData != null)
         return MapleDataTool.getInt(skillData.getChildByPath("masterLevel"), 0);
     return 0;
    }
    
    public static String getSkillName(int id) {
        String strId = Integer.toString(id);
        strId = StringUtil.getLeftPaddedStr(strId, '0', 7);
        MapleData skillroot = stringData.getChildByPath(strId);
        if (skillroot != null) 
            return MapleDataTool.getString(skillroot.getChildByPath("name"), "");
        return null;
    }

   public static String getLeftPaddedStr(String in, char padchar, int length) {
       StringBuilder builder = new StringBuilder(length);
       for (int x = in.getBytes().length; x < length; ++x) 
           builder.append(padchar);
       builder.append(in);
       return builder.toString();
   }
   
   public static Skill loadFromData(int id, MapleData data) {
       //System.out.println("正在解析的技能id:"+id);
       //System.out.println("正在解析的技能名字:"+getSkillName(id));
       Skill ret = new Skill(id);
       boolean isBuff = false;
       int skillType = MapleDataTool.getInt("skillType", data, -1);
       String elem = MapleDataTool.getString("elemAttr", data, null);
       ret.masterLevel = MapleDataTool.getInt("masterLevel", data, 0);
       ret.isCommon = (data.getChildByPath("common") != null);
     
       if (ret.isCommon) 
           ret.maxLevel = MapleDataTool.getInt(data.getChildByPath("common").getChildByPath("maxLevel"), 1);
     
       if (elem != null)
           ret.element = Element.getFromChar(elem.charAt(0));
       else
           ret.element = Element.PHYSICAL;
       
       MapleData effect = data.getChildByPath("effect");
       if (skillType != -1) {
           if (skillType == 2 || id == 风灵使者.终极弓 || id == 魂骑士.终极剑)
               isBuff = true;
       } else {
           MapleData action = data.getChildByPath("action");
           MapleData hit = data.getChildByPath("hit");
           MapleData ball = data.getChildByPath("ball");
           isBuff = (effect != null) && (hit == null) && (ball == null);
           isBuff |= ((action != null) && (MapleDataTool.getString("0", action, "").equals("alert2")));
      
           switch (id) {
               case 勇士.突进: // 突进
               case 骑士.突进: // 突进
               case 龙骑.突进: // 突进
               case 龙骑.龙之献祭: // 龙之献祭
               case 火毒.末日烈焰: // 末日烈焰
               case 火毒.致命毒雾: // 致命毒雾
               case 牧师.群体治愈: // 群体治愈
               case 弓手.贯穿箭: // 贯穿箭
               case 弩手.贯穿箭: // 贯穿箭
               case 标飞.生命吸收: // 生命吸收
               case 标飞.影网术: // 影网术
               case 刀飞.神通术: // 神通术
               case 刀飞.烟幕弹: // 烟幕弹
               case 勇士.磁石: // 磁石
//               case 骑士.磁石: // 磁石
               case 龙骑.磁石: // 磁石
               case 枪手.激退射杀: // 激退射杀
               case 拳手.能量耗转: // 能量耗转
               case 炎术士.火牢术屏障: // 火牢术屏障
               case 夜行者.吸血: // 吸血
               case 夜行者.影网术: // 影网术
               case 夜行者.毒炸弹: // 毒炸弹
                   isBuff = false;
                   break;
               case 新手.团队治疗: // 团队治疗
               case 新手.疾风步: // 疾风步
               case 新手.骑兽技能: // 骑兽技能
               case 新手.英雄之回声: // 英雄之回声
               // 战士
              case 战士.圣甲术: // 圣甲术
               // 英雄技能
               case 勇士.快速武器: // 快速剑
               case 勇士.愤怒之火: // 愤怒之火
               case 勇士.伤害反击: // 伤害反击
               case 勇士.斗气集中: // 斗气集中
               case 勇士.魔击无效: // 防御崩坏
               case 勇士.冒险岛勇士: // 冒险岛勇士
               case 勇士.稳如泰山: // 稳如泰山
               case 勇士.葵花宝典: // 葵花宝典
               case 勇士.勇士的意志: // 勇士的意志
                // 圣骑士
               case 骑士.快速武器: // 快速剑
//               case 1201005: // 快速钝器
               case 骑士.压制术: // 压制术
               case 骑士.伤害反击: // 伤害反击
               case 骑士.火焰冲击: // 火焰冲击
               case 骑士.寒冰冲击: // 寒冰冲击
               case 骑士.雷鸣冲击: // 雷鸣冲击
               case 骑士.魔击无效: // 魔击无效
               case 骑士.祝福护甲: // 祝福护甲
               case 骑士.冒险岛勇士: // 冒险岛勇士
               case 骑士.稳如泰山: // 稳如泰山
//               case 1221003: // 圣灵之剑
               case 骑士.神圣冲击: // 圣灵之锤
               case 骑士.勇士的意志: // 勇士的意志
               // 黑骑士
               case 龙骑.极限防御: // 极限防御
               case 龙骑.神圣之火: // 神圣之火
               case 龙骑.龙咆哮: // 龙咆哮
               case 龙骑.魔击无效: // 魔击无效
               case 龙骑.龙之魂: // 龙之魂
               case 龙骑.冒险岛勇士: // 冒险岛勇士
               case 龙骑.稳如泰山: // 稳如泰山
               case 龙骑.灵魂助力: // 灵魂助力
               case 龙骑.灵魂治愈: // 灵魂治愈
               case 龙骑.灵魂祝福: // 灵魂祝福
               case 龙骑.勇士的意志: // 勇士的意志
               // 法师
               case 法师.魔法盾: // 魔法盾
               case 法师.魔法铠甲: // 魔法铠甲
               // 火毒导师
               case 火毒.精神力: // 精神力
               case 火毒.缓速术: // 缓速术
               case 火毒.封印术: // 封印术
               case 火毒.魔法狂暴: // 魔法狂暴
               case 火毒.快速移动精通: // 快速移动精通
               case 火毒.自然力重置: // 自然力重置
               case 火毒.冒险岛勇士: // 冒险岛勇士
               case 火毒.魔法反击: // 魔法反击
               case 火毒.终极无限: // 终极无限
               case 火毒.火魔兽: // 冰破魔兽
               case 火毒.勇士的意志: // 勇士的意志
               // 冰雷导师
               case 2201001: // 精神力
               case 2201003: // 缓速术
               case 冰雷.封印术: // 封印术
               case 冰雷.魔法狂暴: // 魔法狂暴
               case 冰雷.快速移动精通: // 快速移动精通
               case 冰雷.自然力重置: // 自然力重置
               case 冰雷.冒险岛勇士: // 冒险岛勇士
               case 冰雷.魔法反击: // 魔法反击
               case 冰雷.终极无限: // 终极无限
               case 冰雷.冰破魔兽: // 火魔兽
               case 冰雷.勇士的意志: // 勇士的意志
               // 主教
               case 牧师.神之保护: // 神之保护
               case 牧师.祝福: // 祝福
               case 牧师.净化: // 净化
               case 牧师.神圣祈祷: // 神圣祈祷
               case 牧师.巫毒术: // 巫毒术
               case 牧师.圣龙召唤: // 圣龙召唤
               case 牧师.快速移动精通: // 快速移动精通
               case 牧师.冒险岛勇士: // 冒险岛勇士
               case 牧师.魔法反击: // 魔法反击
               case 牧师.强化圣龙: // 强化圣龙
               case 牧师.终极无限: // 终极无限
               case 牧师.圣灵之盾: // 圣灵之盾
               case 牧师.勇士的意志: // 勇士的意志
               // 弓箭手
               case 弓箭手.集中术: // 集中术
               // 神射手
               case 弓手.快速箭: // 快速箭
               case 弓手.无形箭: // 无形箭
               case 弓手.替身术: // 替身术
               case 弓手.银鹰召唤: // 银鹰召唤
               case 弓手.冒险岛勇士: // 冒险岛勇士
               case 弓手.火眼晶晶: // 火眼晶晶
               case 弓手.火凤凰: // 火凤凰
               case 弓手.集中精力: // 集中精力
               case 弓手.勇士的意志: // 勇士的意志
               // 游侠
               case 弩手.快速弩: // 快速弩
               case 弩手.无形箭: // 无形箭
               case 弩手.替身术: // 替身术
               case 弩手.金鹰召唤: // 金鹰召唤
               case 弩手.冒险岛勇士: // 冒险岛勇士
               case 弩手.火眼晶晶: // 火眼晶晶
               case 弩手.冰凤凰: // 冰凤凰
               case 弩手.刺眼箭: // 刺眼箭
               case 弩手.勇士的意志: // 勇士的意志
               // 飞侠
               case 飞侠.隐身术: // 隐身术
               // 隐士
               case 标飞.快速暗器: // 快速暗器
               case 标飞.轻功: // 轻功
               case 标飞.聚财术: // 聚财术
               case 标飞.影分身: // 影分身
               case 标飞.黑暗杂耍: // 黑暗杂耍
               case 标飞.冒险岛勇士: // 冒险岛勇士
               case 标飞.忍者伏击: // 忍者伏击
               case 标飞.暗器伤人: // 暗器伤人
               case 标飞.勇士的意志: // 勇士的意志
               // 侠盗
               case 刀飞.快速短刀: // 快速短刀
               case 刀飞.轻功: // 轻功
               case 刀飞.敛财术: // 敛财术
               case 刀飞.金钱护盾: // 金钱护盾
               case 刀飞.黑暗杂耍: // 黑暗杂耍
               case 刀飞.影分身: // 影分身
               case 刀飞.二段跳: // 二段跳
               case 刀飞.冒险岛勇士: // 冒险岛勇士
               case 刀飞.忍者伏击: // 忍者伏击
               case 刀飞.勇士的意志: // 勇士的意志
               // 海盗
               case 海盗.疾驰: // 疾驰
               // 冲锋队长
               case 拳手.急速拳: // 急速拳
               case 拳手.橡木伪装: // 橡木伪装
               case 拳手.能量获得: //能量获得
               case 拳手.超人变形: // 超人变形
               case 拳手.冒险岛勇士: // 冒险岛勇士
               case 拳手.超级变身: // 超级变身
               case 拳手.勇士的意志: // 勇士的意志
               case 拳手.极速领域: // 极速领域
               // 船长
               case 枪手.章鱼炮台: // 章鱼炮台
               case 枪手.海鸥空袭: // 海鸥空袭
               case 枪手.冒险岛勇士: // 冒险岛勇士
               case 枪手.超级章鱼炮台: // 超级章鱼炮台
               case 枪手.武装: // 武装
               case 枪手.勇士的意志: // 勇士的意志
               // 管理员
               case 管理员.上乘轻功: // 上乘轻功
               case 管理员.神圣祈祷: // 神圣祈祷
               case 管理员.枫印祝福: // 枫印祝福
               case 管理员.隐藏术: // 隐藏术
               case 管理员.神圣之火: // 神圣之火
               // 骑士团
               case 初心者.团队治疗: // 团队治疗
               case 初心者.疾风步: // 疾风步
               case 初心者.骑兽技能: // 骑兽技能
               case 初心者.英雄之回声: // 英雄之回声
               // 魂骑士
               case 魂骑士.圣甲术: // 圣甲术
               case 魂骑士.魂精灵: // 魂精灵
               case 魂骑士.快速剑: // 快速剑
               case 魂骑士.终极剑: // 终极剑
               case 魂骑士.愤怒之火: // 愤怒之火
               case 魂骑士.斗气集中: // 斗气集中
               case 魂骑士.灵魂属性: // 灵魂属性
               // 炎术士
               case 炎术士.魔法盾: // 魔法盾
               case 炎术士.魔法铠甲: // 魔法铠甲
               case 炎术士.炎精灵: // 炎精灵
               case 炎术士.精神力: // 精神力
               case 炎术士.缓速术: // 缓速术
               case 炎术士.魔法狂暴: // 魔法狂暴
               case 炎术士.自然力重置: // 自然力重置
               case 炎术士.封印术: // 封印术
               case 炎术士.火魔兽: // 火魔兽
               // 风灵使者
               case 风灵使者.集中术: // 集中术
               case 风灵使者.风精灵: // 风精灵
               case 风灵使者.快速箭: // 快速箭
               case 风灵使者.终极弓: // 终极弓
               case 风灵使者.无形箭: // 无形箭
               case 风灵使者.风影漫步: // 风影漫步
               case 风灵使者.替身术: // 替身术
               case 风灵使者.信天翁: // 信天翁
               // 夜行者
               case 夜行者.隐身术: // 隐身术
               case 夜行者.夜精灵: // 夜精灵
               case 夜行者.快速暗器: // 快速暗器
               case 夜行者.轻功: // 轻功
               case 夜行者.影分身: // 影分身
               // 奇袭者
               case 奇袭者.疾驰: // 疾驰
               case 奇袭者.雷精灵: // 雷精灵
               case 奇袭者.能量获得: // 能量获得
               case 奇袭者.急速拳: // 急速拳
               case 奇袭者.雷鸣: // 雷鸣
               case 奇袭者.能量耗转: // 能量耗转
               case 奇袭者.超人变形: // 超人变形
               case 奇袭者.极速领域: // 极速领域
               case 奇袭者.闪光击: // 闪光击
               // 战神
               case 战神.团队治疗: // 团队治疗
               case 战神.疾风步: // 疾风步
               case 战神.骑兽技能: // 骑兽技能
               case 战神.英雄之回声: // 英雄之回声
               case 战神.精灵的祝福: // 精灵的祝福
               case 战神.矛连击强化: // 矛连击强化
               case 战神.快速矛: // 快速矛
               case 战神.连环吸血: // 连环吸血
               case 战神.抗压: // 抗压
               case 战神.灵巧击退: // 灵巧击退
               case 战神.冰雪矛: // 冰雪矛
               case 战神.冒险岛勇士: // 冒险岛勇士
               case 战神.战神之盾: // 战神之盾:
               case 战神.战神的意志: // 战神的意志
               case 战神.勇士的意志: // 勇士的意志
               // 龙神
               case 龙神.团队治疗: // 团队治疗
               case 龙神.疾风步: // 疾风步
               case 龙神.骑兽技能: // 骑兽技能
               case 龙神.英雄之回声: // 英雄之回声
               case 龙神.魔法盾: // 魔法盾
               case 龙神.自然力重置: // 自然力重置
               case 龙神.魔法屏障: // 魔法屏障
               case 龙神.魔法狂暴: // 魔法狂暴
               case 龙神.缓速术: // 缓术速
               case 龙神.抗魔领域: // 抗魔领域
               case 龙神.极光恢复: // 极光恢复
               case 龙神.冒险岛勇士: // 冒险岛勇士
               case 龙神.勇士的意志: // 勇士的意志
               case 龙神.玛瑙的祝福:
               case 龙神.玛瑙的保佑:
               case 龙神.玛瑙的意志:
               // 暗影双刀
               case 双刀.快速双刀: // 快速双刀
//               case 4310000: // 恢复术
               case 双刀.暗影轻功: // 暗影轻功
               case 双刀.进阶隐身术: // 进阶隐身术
               case 双刀.死亡猫头鹰: // 死亡猫头鹰
               case 双刀.镜像分身: // 镜像分身
               case 双刀.冒险岛勇士: // 冒险岛勇士
               case 双刀.终极斩: // 终极斩
               case 双刀.傀儡召唤: // 傀儡召唤
               case 双刀.荆棘: // 荆棘
               case 双刀.勇士的意志: // 勇士的意志
               // 幻灵斗师
               case 预备兵.潜入: // 潜入
               case 战法.黑暗灵气: // 黑暗灵气
               case 战法.蓝色灵气: // 蓝色灵气
               case 战法.黄色灵气: // 黄色灵气
               case 战法.伤害吸收: // 伤害吸收
               case 战法.快速长杖: // 快速长杖
               case 战法.进阶蓝色灵气: // 进阶蓝色灵气
               case 战法.转化: // 转化
               case 战法.霸体: // 霸体
               case 战法.重生: // 重生
               case 战法.快速移动精通: // 快速移动精通
               case 战法.飓风: // 飓风
               case 战法.稳如泰山: // 稳如泰山
               case 战法.冒险岛勇士: // 冒险岛勇士
               case 战法.勇士的意志: // 勇士的意志
               case 战法.进阶黑暗灵气: // 进阶黑暗灵气
               case 战法.进阶黄色灵气: // 进阶黄色灵气
               // 豹弩游侠
               case 弩骑.美洲豹骑士: // 美洲豹骑士
               case 弩骑.快速弩: // 快速弩
               case 弩骑.野性陷阱: // 野性陷阱
               // 机械师
               case 机械师.火焰喷射器: // 火焰喷射器
               case 机械师.强化火焰喷射器: // 强化火焰喷射器
               case 机械师.金属机甲_原型: // 金属机甲：原型
               case 机械师.机械加速: // 机械加速
               case 机械师.完美机甲: // 完美机甲
               case 机械师.人造卫星: // 人造卫星
               case 机械师.人造卫星2: // 人造卫星
               case 机械师.人造卫星3: // 人造卫星
               case 机械师.金属机甲_重机枪: // 金属机甲：重机枪
               case 机械师.磁场: // 磁场
               case 机械师.加速器: // 加速器：EX-7
               case 机械师.治疗机器人: // 治疗机器人：H-LX
               case 机械师.战争机器_泰坦: // 战争机器：泰坦
               case 机械师.金属机甲_导弹战车: // 金属机甲：导弹战车
               case 机械师.卫星防护: // 卫星防护
               case 机械师.冒险岛勇士: // 冒险岛勇士
               case 机械师.勇士的意志: // 勇士的意志
               case 机械师.机器人工厂_RM1: // 机器人工厂：RM1
               case 机械师.放大器_AF_11: // 放大器：AF-11
               //case 35121011: // 机器人工厂召唤技能
               case 机械师.金属机甲_重机枪_4转:
               case 拳手.幸运骰子:
               case 枪手.幸运骰子:
               case 机械师.幸运骰子:
                   isBuff = true;
                   break;
           }
       }
       
       if (data.getChildByPath("keydown") != null)
           ret.hasCharge = true;
       
       if (!ret.isCommon) //老的函数
           for (MapleData level : data.getChildByPath("level"))
               ret.effects.add(MapleStatEffect.loadSkillEffectFromData(level, id, 0, true, isBuff));
               
       else  //新的xml结构
           for (int level = 1; level <= ret.maxLevel; ++level)
               ret.effects.add(MapleStatEffect.loadSkillEffectFromData(data.getChildByPath("common"), id, level, false, isBuff));
       
       ret.animationTime = 0;
       
       if (effect != null) 
           for (MapleData effectEntry : effect) 
               ret.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0);
       
       return ret;
   }
 }
